package com.thread.thread4;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

/**
 * @author : leimingchao
 * @date Date : 2021年11月30日 20:17
 */
public class ExecutorTest {

    /**
     * 任务交给线程池，出现异常无法感知
     * @param args
     */
    public static void main(String[] args) {

        //使用线程池控制系统资源，防止线程把资源耗尽
        //默认的线程池里面的queue是一个无界队列，极限情况：线程全部放进队列。可能出现无界队列把内存撑爆
        //ThreadPool:拒绝策略。四种：自己总结；默认出异常
        //线程数调多少合适？cpu内核数。实际：必须通过压力测试来寻找系统最佳参数
        //压力。峰值流量 * 3。  cpu^3
        ExecutorService threadPool = Executors.newFixedThreadPool(2);

        System.out.println("线程池任务准备");
        for (int i = 0; i < 10; i++) {
            Thread thread = new Thread(() -> {
                System.out.println("当前线程开始：" + Thread.currentThread());
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                int j = 10 / 0;
                System.out.println("当前线程结束：" + Thread.currentThread());
            });
            //给线程池提交任务
            threadPool.submit(thread);
        }
        System.out.println("所有任务都已提交。。。。。");
        threadPool.shutdown();
    }
}
